

#include "../coredef.h"
#include "cppdef.h"


S4 CppErrorMain(VOID )
{
	U2 kindRet = TRUE;
	S4 getMax = 0;
	S4 nNewDirInfo = 0;
	S4 errorMessageLoc = 0;
	S4 RetInt;
	PSZ buf = NULL;
	BOOL bSpace = TRUE;
	S4 nextTokenRet = TRUE;

	getMax = stCppDirectiveIFGroupAccess.getMax();
	kindRet = stCppDirectiveIFGroupAccess.state.get( getMax );
	if (kindRet != TRUE)
	{
		FATAL_ON_FATAL(CppTokensDelAll());
		return(COEXIT_SUCCESS);
	}

	/* テーブルKIND_DIRECTIVEINFOに1行を追加する */
	FATAL_ON_FALSE(stCoreDirectiveInfoAccess.alloc(1));
	/* テーブルKIND_DIRECTIVEINFOの追加した行のULONG_DIRECTIVEKIND属性に　CPPDEF_INCを設定する  */
	nNewDirInfo = stCoreDirectiveInfoAccess.getMax();
	stCoreDirectiveInfoAccess.kind.set(nNewDirInfo, CPPDEF_ERROR);
	/* 位置情報取得し、設定 */
	RetInt = CppLocSetDirectiveScope(nNewDirInfo);
	if( RetInt != COEXIT_SUCCESS )
	{
		return RetInt;
	}
	/* バッファーbufReadの文字数＋１を「ERRORメッセージ位置」に格納( Mem_GetMaxbyKind ) */
	errorMessageLoc = 0;

	nextTokenRet = CppTokenGetNextToken( TRUE, FALSE );
	while( nextTokenRet == COEXIT_SUCCESS )
	{
		/* KIND_PPTOKENのTOKENINDEX行目のUSHORT_PPTOKENKIND属性取得 */
		kindRet = stCppTokenAccess.tokenKind.get(CUR_TOKEN_INDEX );
		if( kindRet == xPPTOKEN_HSPACE || kindRet == xPPTOKEN_VSPACE )
		{
			if( bSpace == FALSE ){
				errorMessageLoc = stCppLabelStrAccess.appendStr( errorMessageLoc, " " );
				bSpace = TRUE;
			}
		}else{
			/* 現在の前処理字句の文字列を取得して、バッファーbufReadに追加する */
			buf = stCppTokenAccess.name.get( CUR_TOKEN_INDEX );
			if( str_length( buf ) > 0 ){
				errorMessageLoc = stCppLabelStrAccess.appendStr( errorMessageLoc, buf );
				bSpace = FALSE;
			}
		}
		nextTokenRet = CppTokenGetNextToken( FALSE, FALSE );
	}

	CppThrowWarning( CPP_ERR_MESSAGE,
			stCoreDirectiveInfoAccess.locScope.get(nNewDirInfo),
			stCppLabelStrAccess.getStr(errorMessageLoc), NULL );
	stCoreDirectiveInfoAccess.str_param.set(nNewDirInfo, stCppLabelStrAccess.getStr(errorMessageLoc));

	/* テーブルKIND_PPTOKEN　をクリアする */
	/* バッファーKIND_BUFSYMNAME　をクリアする */
	FATAL_ON_FATAL(CppTokensDelAll());

	return( COEXIT_ERROR );

}
